package ar.uba.is2.common.mensaje;

import ar.uba.is2.common.mensaje.contenido.ContenidoAck;
import ar.uba.is2.common.mensaje.contenido.ContenidoDatoSuscripto;
import ar.uba.is2.common.mensaje.contenido.ContenidoDatosSensados;
import ar.uba.is2.common.mensaje.contenido.ContenidoSuscripcionDato;

public enum TipoMensaje {

	DATOS_SENSADOS('D') {

		@Override
		public Contenido instanciarContenido() {
			return new ContenidoDatosSensados();
		}

	}, ACK('K') {
		
		@Override
		public Contenido instanciarContenido() {
			return new ContenidoAck();
		}
	}, SUSCRIBIRSE_A_DATO('S') {
		@Override
		public Contenido instanciarContenido() {
			return new ContenidoSuscripcionDato();
		}
	}, DATOS_SUSCRIPTOS('T') {
		@Override
		public Contenido instanciarContenido() {
			// TODO Auto-generated method stub
			return new ContenidoDatoSuscripto();
		}
	};
	
	private char id;
	
	private TipoMensaje(char id) {
		this.id = id;
	}
	
	public abstract Contenido instanciarContenido();
	
	public static TipoMensaje deserializar(String stream) {
		char id = stream.charAt(0);
		
		switch (id) {
		case 'D' :
			return DATOS_SENSADOS;
		case 'K' :
			return ACK;
		case 'S' : 
			return SUSCRIBIRSE_A_DATO;
		case 'T' :
			return DATOS_SUSCRIPTOS;
		default :
			throw new RuntimeException(String.format("Tipo de mensaje '%s' desconocido", id));
		}
	}
	
	public String serializar() {
		return String.valueOf(this.id);
	}
	
}
